package concurrency.reordering;

/**
 * 这段代码首先定义四个静态变量x,y,a,b，每次循环时让他们都等于0，接着用两个线程，第一个线程执行a=1;x=b;第二个线程执行b=1;y=a。
 *
 * 这段程序有几个结果呢？从逻辑上来讲，应该有3种运行情况：
 * 当第一个线程执行到a=1的时候，第二个线程执行到了b=1，最后x=1，y=1；
 * 当第一个线程执行完，第二个线程才刚开始，最后x=0，y=1；
 * 当第二个线程执行完，第一个线程才开始，最后x=1，y=0；
 *
 * 理论上是不可能出现x=0，y=0的结果，但是实际还是发生了。
 * 第26962次执行x=0y=1
 * 第26963次执行x=0y=1
 * 第26964次执行x=0y=1
 * 第26965次执行x=0y=1
 * 第26966次执行x=0y=0
 *
 * 其实这种情况正式应为发生了重排序。导致都先运行x=a,y=b
 */
public class ReOrderingDemo {
    //定义四个静态变量
    private static int x=0,y=0;
    private static int a=0,b=0;

    public static void main(String[] args) throws InterruptedException {
        int i=0;
        while (true){
            i++;
            x=0;y=0;a=0;b=0;
            //开两个线程，第一个线程执行a=1;x=b;第二个线程执行b=1;y=a
            Thread thread1=new Thread(new Runnable() {
                @Override
                public void run() {
                    a=1;
                    x=b;
                }
            });
            Thread thread2=new Thread(new Runnable() {
                @Override
                public void run() {
                    b=1;
                    y=a;
                }
            });
            thread1.start();
            thread2.start();
            thread1.join();
            thread2.join();
            //等两个线程都执行完毕后拼接结果
            String result="第"+i+"次执行x="+x+"y="+y;
            //如果x=0且y=0，则跳出循环
            if (x==0&&y==0){
                System.out.println(result);
                break;
            }else{
                System.out.println(result);
            }
        }
    }
}